// flags/enter.go
// =============================================================================
// | 包: flags                                                                |
// | 功能: 处理命令行参数解析与选项管理                                         |
// =============================================================================
package flags

import (
	"flag" // Go标准库命令行参数解析 - 提供命令行参数定义和解析功能
	"os"   // 操作系统接口 - 提供与操作系统交互的功能，如程序退出
)

// =============================================================================
// | 结构体: Options                                                          |
// | 功能: 命令行参数选项定义                                                 |
// | 用途: 通过命令行参数控制程序行为模式，定义程序可接收的所有命令行参数      |
// =============================================================================
type Options struct {
	// =============================================================================
	// | 字段: File - string                                                      |
	// | 功能: 配置文件路径                                                       |
	// | 默认值: "setting.yaml"                                                  |
	// | 用途: 指定应用程序使用的配置文件位置                                     |
	// =============================================================================
	File string

	// =============================================================================
	// | 字段: DB - bool                                                          |
	// | 功能: 数据库迁移开关                                                     |
	// | 默认值: false                                                           |
	// | 用途: 控制是否执行数据库迁移操作                                         |
	// =============================================================================
	DB bool

	// =============================================================================
	// | 字段: Version - bool                                                     |
	// | 功能: 版本信息显示开关                                                   |
	// | 默认值: false                                                           |
	// | 用途: 控制是否显示程序版本信息                                           |
	// =============================================================================
	Version bool
}

// =============================================================================
// | 变量: FlagOptions                                                        |
// | 类型: *Options                                                           |
// | 功能: 全局命令行参数实例                                                 |
// | 用途: 存储解析后的命令行参数值，供程序其他部分访问命令行参数的值          |
// =============================================================================
var FlagOptions = new(Options)

// =============================================================================
// | 函数: Parse                                                              |
// | 参数: 无                                                                  |
// | 返回: 无                                                                  |
// | 功能: 解析命令行参数                                                      |
// | 说明: 将命令行参数与变量绑定并执行解析，在程序启动时解析用户提供的命令行参数 |
// |----------------------------------------------------------------------------|
// | 流程:                                                                     |
// | 1. 绑定配置文件路径参数 (-f)                                              |
// | 2. 绑定数据库迁移参数 (-db)                                               |
// | 3. 绑定版本信息参数 (-v)                                                  |
// | 4. 执行参数解析                                                           |
// =============================================================================
func Parse() {
	// 绑定配置文件路径参数
	// | 参数名: -f
	// | 默认值: "setting.yaml"
	flag.StringVar(&FlagOptions.File, "f", "setting.yaml", "配置文件") // 将配置文件路径参数绑定到FlagOptions.File

	// 绑定数据库迁移参数
	// | 参数名: -db
	// | 默认值: false
	flag.BoolVar(&FlagOptions.DB, "db", false, "数据库迁移") // 将数据库迁移参数绑定到FlagOptions.DB

	// 绑定版本信息参数
	// | 参数名: -v
	// | 默认值: false
	flag.BoolVar(&FlagOptions.Version, "v", false, "版本") // 将版本信息参数绑定到FlagOptions.Version

	// 执行参数解析
	// | 注意: 必须在所有flag绑定后调用此函数                                     |
	flag.Parse() // 解析命令行参数，填充到绑定的变量中
}

// =============================================================================
// | 函数: Run                                                                |
// | 参数: 无                                                                  |
// | 返回: 无                                                                  |
// | 功能: 根据命令行参数执行相应操作                                          |
// | 说明: 检查数据库迁移标志，如果设置则执行数据库迁移并退出程序              |
// |----------------------------------------------------------------------------|
// | 流程:                                                                     |
// | 1. 检查是否设置了数据库迁移参数 (-db)                                     |
// | 2. 如果设置了，则执行FlagDB函数进行数据库迁移                             |
// | 3. 执行完成后退出程序                                                     |
// =============================================================================
func Run() {
	// go run main.go -db
	if FlagOptions.DB { // 检查是否启用了数据库迁移模式
		// 执行数据库迁移
		// fmt.Println(global.DB, global.Config)
		FlagDB() // 调用数据库迁移函数
		os.Exit(0) // 迁移完成后退出程序
	}
}
